home *** CD-ROM | disk | FTP | other *** search
-
-
- #ifndef FRAMBULANCE_H
- #define FRAMBULANCE_H
-
- #include "FRCar.h"
-
- class FRAmbulance : public FRCar
- {
- TERTTIDeclaration;
-
- public:
-
- FRAmbulance(TEVector &rCenter, Float fInitYRot)
- {
- TEOBoundingBox *pOBox = new TEOBoundingBox;
- TEAABoundingBox BBox;
- TEVector Min, Max;
- TEEngine *pEngine = TEEngine::GetEngine();
- TESoundManager* pSound = TESoundManager::GetSoundManager();
- TEString Pak = "EngineSFX";
- TEString Name = "corona03";
-
- m_pSiren = TETextureManager::GetTextureManager()->GetTexture(Name, Pak, false, 1, true);
-
- Name = "motor3.ogg";
- m_pMotor = pSound->GetSound(Name);
- Name = "brake.ogg";
- m_pBraking = pSound->GetSound(Name);
- Name = "siren2.ogg";
- m_pHorn = pSound->GetSound(Name);
-
- m_fMass = 3750.0f;
-
- m_fMaxRPM = 5000.0f;
- m_fRotFactor = 85.0f;
-
- m_ulNumGears = 5;
- m_aGears = new FRGearInfo[5];
-
- m_aGears[0].fRPMChange = 2500.0f;
- m_aGears[0].fRPMTrans = -100.0f;
- m_aGears[1].fRPMChange = 3500.0f;
- m_aGears[1].fRPMTrans = 100.0f;
- m_aGears[2].fRPMChange = 2000.0f;
- m_aGears[2].fRPMTrans = 150.0f;
- m_aGears[3].fRPMChange = 400.0f;
- m_aGears[3].fRPMTrans = 250.0f;
- m_aGears[4].fRPMChange = 150.0f;
- m_aGears[4].fRPMTrans = 400.0f;
-
- m_Center = m_OldCenter = rCenter;
- m_Rotation = TEVector(0.0f, fInitYRot, 0.0f);
-
- m_pModelRef = TEModelManager::GetModelManager()->GetModel("ambulance.tmf");
- TEAssert(m_pModelRef);
-
- m_pModelRef->SetAnimation(0);
- m_pModelRef->SetTimeScale(0);
- m_pModelRef->SetLoopAnimation(true);
-
- BBox = m_pModelRef->GetModelBBox();
- BBox.GetData(Min, Max);
- m_CarSize = Max - Min;
-
- m_Center.m_fX = m_OldCenter.m_fX = rCenter.m_fX;
- m_Center.m_fY = m_OldCenter.m_fY = m_fDeltaY = TEAbs(Min.m_fY) + 0.05f;
- m_Center.m_fZ = m_OldCenter.m_fZ = rCenter.m_fZ;
-
- pOBox->SetData(m_Center, Min, Max, m_Rotation);
-
- m_pBoundingVolume = pOBox;
-
- m_fFrontAxis = 0.0f;
- m_fRearAxis = -53.0f;
-
- m_fWheelWidth = 5.5f;
- m_fWheelMov = 2.75f;
-
- m_aLightPos[0] = TEVector(-9.00f, -9.0f, 42.0f);
- m_aLightPos[1] = TEVector( 9.00f, -9.0f, 42.0f);
- m_aLightPos[2] = TEVector(-9.00f, -7.5f, -42.0f);
- m_aLightPos[3] = TEVector( 9.00f, -7.5f, -42.0f);
-
- m_fBrakeEfficiency = 13.0f;
-
- UpdateVectors();
-
- if(ms_bSmoke)
- {
- TEVector Center = m_pBoundingVolume->GetCenter();
- TEVector Tmp = Center + m_aExhaustPos[0].m_fX * m_Right +
- m_aExhaustPos[0].m_fY * m_Up + m_aExhaustPos[0].m_fZ * m_Forward;
-
- m_usNumExhaust = 1;
- m_aExhaustPos[0] = TEVector(7.0f, -11.5f, -44.0f);
-
- m_aExhaust[0] = new TEParticleFX(Tmp, 2, 4, 1.6f, 0, 0, 0, m_Up, 250, 1000,
- 255, 1.0f, true, false);
-
- m_aExhaust[0]->SetColor(255, 255, 255);
-
- pEngine->AddParticleSystem(m_aExhaust[0]);
- }
-
- if(m_pMotor != NULL)
- m_pMotor->Play3D(m_Center, m_Velocity, TESOUND_LOOP, 1.0f);
-
- m_bHornEnabled = false;
- m_aSirenPos[0] = TEVector(-8.5f, 19.75f, 24.5f);
- m_aSirenPos[1] = TEVector( 8.5f, 19.75f, 24.5f);
- m_aSirenPos[2] = TEVector( 0.0f, 19.75f, -36.25f);
- }
-
- ~FRAmbulance()
- {
- SafeDelete(m_pSiren);
- }
-
- void Horn(void)
- {
- if(!m_bHornEnabled)
- {
- if(m_pHorn != NULL && !m_pHorn->IsPlaying())
- m_pHorn->Play3D(m_Center, m_Velocity, TESOUND_LOOP, 3.0f);
-
- m_acSirenDir[0] = -1;
- m_aucSirenState[0] = 255;
- m_acSirenDir[1] = 1;
- m_aucSirenState[1] = 0;
- m_acSirenDir[2] = 1;
- m_aucSirenState[2] = 128;
-
- m_bHornEnabled = true;
- }
- else
- {
- if(m_pHorn != NULL && m_pHorn->IsPlaying())
- m_pHorn->Stop();
-
- m_bHornEnabled = false;
- }
- }
-
- void Update(UInt32 ulDeltaT, TEEngine* pEngine)
- {
- FRCar::Update(ulDeltaT, pEngine);
-
- if(m_bHornEnabled)
- {
- for(UInt16 usCount = 0; usCount < 3; usCount++)
- {
- Int16 sBuf = (Int16) (ulDeltaT * 1.5f);
-
- if(m_acSirenDir[usCount] == 1)
- sBuf = m_aucSirenState[usCount] + sBuf;
- else sBuf = m_aucSirenState[usCount] - sBuf;
-
- if(sBuf <= 0)
- {
- m_aucSirenState[usCount] = 0;
- m_acSirenDir[usCount] = 1;
- }
- else if(sBuf >= 255)
- {
- m_aucSirenState[usCount] = 255;
- m_acSirenDir[usCount] = -1;
- }
- else m_aucSirenState[usCount] = (UChar) sBuf;
- }
- }
- }
-
- void Render(TERenderer* pRender, TECamera* pCam)
- {
- TEVector Tmp, Center, Cam;
- Float fScale, fDist, fMaxCorona;
-
- if(m_Visibility == INVISIBLE)
- return;
- else if(m_Visibility == BLINKING)
- {
- UInt32 ulTmp, ulTime = TETimer::GetTimer()->GetElapsedTime(m_ulLastReset);
-
- if(ulTime < 2500)
- {
- m_bClip = false;
- ulTmp = ulTime % 250;
-
- if(ulTmp > 75 + ulTime / 25)
- return;
- }
- else
- {
- m_Visibility = NORMAL;
- m_bClip = true;
- }
- }
-
- TEEngineObject::Render(pRender, pCam);
-
- fMaxCorona = TEEngine::GetEngine()->GetMaxCoronaDistance();
- Cam = pCam->GetPosition();
- Center = m_pBoundingVolume->GetCenter();
- fDist = (Center - Cam).GetLength();
-
- if(fDist < fMaxCorona)
- {
- if(fDist > fMaxCorona/4.0f)
- fScale = MAX_LIGHT_SIZE;
- else
- fScale = fDist * TEEngine::GetEngine()->GetCoronaFactor();
-
- if(fScale < MIN_LIGHT_SIZE)
- fScale = MIN_LIGHT_SIZE;
- else if(fScale > MAX_LIGHT_SIZE)
- fScale = MAX_LIGHT_SIZE;
-
- pRender->SetZBufferState(false);
- pRender->EnableBlending();
- pRender->SetBlendingState(BLEND_SRC_ALPHA, BLEND_ONE);
-
- pRender->SetAmbient(255, 255, 255, 192);
-
- Tmp = Center + m_aLightPos[0].m_fX * m_Right + m_aLightPos[0].m_fY * m_Up + m_aLightPos[0].m_fZ * m_Forward;
- pRender->RenderParticle(Tmp, fScale, fScale, m_pFrontLight);
-
- Tmp = Center + m_aLightPos[1].m_fX * m_Right + m_aLightPos[1].m_fY * m_Up + m_aLightPos[1].m_fZ * m_Forward;
- pRender->RenderParticle(Tmp, fScale, fScale, m_pFrontLight);
-
- if(m_fPedal < 0)
- {
- if(m_lCurrentGear == REVERSE_GEAR)
- pRender->SetAmbient(255, 255, 255, 255);
- else pRender->SetAmbient(255, 0, 0, 255);
-
- Tmp = Center + m_aLightPos[2].m_fX * m_Right + m_aLightPos[2].m_fY * m_Up + m_aLightPos[2].m_fZ * m_Forward;
- pRender->RenderParticle(Tmp, fScale, fScale, m_pBackLight);
-
- Tmp = Center + m_aLightPos[3].m_fX * m_Right + m_aLightPos[3].m_fY * m_Up + m_aLightPos[3].m_fZ * m_Forward;
- pRender->RenderParticle(Tmp, fScale, fScale, m_pBackLight);
- }
-
- if(m_bHornEnabled)
- {
- pRender->SetAmbient(255, 255, 255, 255);
- fScale = fScale * 3.0f;
-
- for(UInt16 usCount = 0; usCount < 3; usCount++)
- {
- pRender->SetAmbient(0, 0, m_aucSirenState[usCount], 255);
- Tmp = Center + m_aSirenPos[usCount].m_fX * m_Right + m_aSirenPos[usCount].m_fY * m_Up + m_aSirenPos[usCount].m_fZ * m_Forward;
- pRender->RenderParticle(Tmp, fScale, fScale, m_pSiren);
- }
- }
- pRender->SetZBufferState(true);
- pRender->DisableBlending();
- }
- }
-
- private:
-
- bool m_bHornEnabled;
- TETextureReference* m_pSiren;
- TEVector m_aSirenPos[3];
- Char m_acSirenDir[3];
- UChar m_aucSirenState[3];
- };
-
- #endif
-